﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ChatContrats;
using System.ServiceModel;
using System.Collections;
using System.Runtime.InteropServices;


namespace Client
{
    public partial class discussion : Form, ChatContrats.IChatWCFRappel{

        String pseudoUtilisateurCourant;
        DuplexChannelFactory<ChatContrats.IChatWCF> channelFactory;
        IChatWCF chat;
       
        public Hashtable discutionPrive = new Hashtable();
       // [DllImport("user32.dll")]
        //static extern void FlashWindow(IntPtr a, bool b);
        //[DllImport("user32.dll")]
        //public static extern bool FlashWindowEx(ref FLASHWINFO pwfi);

        

        public discussion()
        {
            InitializeComponent();
            this.deconexionToolStripMenuItem.Enabled = false;
            this.connexionToolStripMenuItem.Enabled = true;
            this.button1.Enabled = false;
            this.listBox1.Enabled = false;
            this.textBox1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(CheckKeys);
            
        }

        private void connexionToolStripMenuItem_Click(object sender, EventArgs e)
        {
            connexion connect = new connexion();
            if (connect.ShowDialog() == DialogResult.OK)
            {
                ConnexionChat(connect.Pseudo);
            }
        }

        private void ConnexionChat(string pseudo)
        {
            if (String.IsNullOrEmpty(pseudo))
                return;

            channelFactory = new DuplexChannelFactory<ChatContrats.IChatWCF>(this, "configClient");

            chat = channelFactory.CreateChannel();

            try
            {
                
                

                    this.connexionToolStripMenuItem.Enabled = false;
                    this.deconexionToolStripMenuItem.Enabled = true;
                    this.listBox1.Enabled = true;
                    this.button1.Enabled = true;
                    pseudoUtilisateurCourant = pseudo;
                chat.DemarrerSession(pseudo);
                chat.getListeUtilisateur();
                

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        public void giveListeUtilisateur(Hashtable utilisateurs)
        {
            foreach (string utilisateur in utilisateurs.Keys)
            {
                if(utilisateur!=this.pseudoUtilisateurCourant)
                this.listBox1.Items.Add(utilisateur);
            }
        }
        public void DeconnexionChat()
        {
            richTextBox1.Clear();
            textBox1.Clear();
            pseudoUtilisateurCourant = null;

            this.deconexionToolStripMenuItem.Enabled = false;
            this.listBox1.Enabled = false;
            this.connexionToolStripMenuItem.Enabled = true;
            this.button1.Enabled = false;

            try
            {
                if (chat != null)
                    chat.FermerSession();
                if (channelFactory != null)
                    channelFactory.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void CheckKeys(object sender, System.Windows.Forms.KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)13)
            {
                this.button1_Click( sender,  e);
            }
        }

        private void EnvoyerMessageServeur(string message)
        {
            try
            {
                if (channelFactory.State != CommunicationState.Faulted)
                {
                    chat.EnvoyerMessage(message);
                }
                else
                {
                    MessageBox.Show("Le canal de communication est défaillant. Vous allez être déconnecté",
          "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    DeconnexionChat();
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        public void ConnexionUtilisateur(string pseudo)
        {
            if (!String.IsNullOrEmpty(pseudo))
            {
                richTextBox1.AppendText(String.Format("*** {0} - {1} vient de se connecter ***", DateTime.Now.ToLongTimeString(), pseudo));
                richTextBox1.AppendText("\n");
            }
        }

        public void DeconnexionUtilisateur(string pseudo)
        {
            if (!String.IsNullOrEmpty(pseudo))
            {
                richTextBox1.AppendText(String.Format("*** {0} - {1} vient de se déconnecter ***", DateTime.Now.ToLongTimeString(), pseudo));
                richTextBox1.AppendText("\n");
            }
        }

        public void ReceptionMessage(string pseudo, string message)
        {
            if (!String.IsNullOrEmpty(pseudo) && !String.IsNullOrEmpty(message))
            {
                richTextBox1.AppendText(String.Format("{0} - {1} dit: ", DateTime.Now.ToLongTimeString(), pseudo));
                richTextBox1.AppendText(message);
                richTextBox1.AppendText("\n");
            }
        }

        public void ReceptionErreur(string erreur)
        {
            MessageBox.Show(erreur, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            EnvoyerMessageServeur(this.textBox1.Text);
            textBox1.Clear();
        }





        public void UtilisateurExistant(String pseudo)
        {
            this.connexionToolStripMenuItem.Enabled = true;
            this.deconexionToolStripMenuItem.Enabled = false;
            this.button1.Enabled = false;
            this.listBox1.Items.Clear();
            this.listBox1.Enabled = false;
            MessageBox.Show("Le pseudo '" + pseudo + "' est déjà utilisé");
        }

        public void nouvelUtilisateurListe(String utilisateur)
        {
            this.listBox1.Items.Add(utilisateur);
            
        }

        public void deconnexionUtilisateurListe(String utilisateur)
        {
            this.listBox1.Items.Remove(utilisateur);

        }

        private void listBox1_DoubleClick(object sender, EventArgs e)
        {
            if (listBox1.SelectedItem != null)
            {

                if (listBox1.SelectedItem.ToString().Length != 0)
                {
                    String destinataire = listBox1.SelectedItem.ToString();
                    
                    DiscussionPrive newDiscution = new DiscussionPrive(destinataire, this.pseudoUtilisateurCourant, chat, channelFactory);
                    discutionPrive.Add(destinataire, newDiscution);
                    newDiscution.Owner = this;
                    newDiscution.Text = destinataire;
                    newDiscution.Show();

                }
            }
        }

        public void newPrivateMessage(String destinataire, String message)
        {
            DiscussionPrive newDiscution;
            if (this.discutionPrive.Contains(destinataire))
            {
                 newDiscution = (DiscussionPrive)this.discutionPrive[destinataire];
                 newDiscution.richTextBox1.AppendText(String.Format("{0} - {1}", DateTime.Now.ToLongTimeString(), message));
                 newDiscution.richTextBox1.AppendText("\n");
                
            }
            else
            {
                 newDiscution = new DiscussionPrive(destinataire, this.pseudoUtilisateurCourant, chat, channelFactory);
                discutionPrive.Add(destinataire, newDiscution);
                newDiscution.richTextBox1.AppendText(String.Format("{0} - {1}", DateTime.Now.ToLongTimeString(), message));
                newDiscution.richTextBox1.AppendText("\n");
                newDiscution.Text = destinataire;
                newDiscution.Owner = this;
                newDiscution.Show();
            }

            if (!newDiscution.Focused)
            {
                wizz wizz = new wizz(newDiscution);
                wizz.doWizz();
                //FlashWindow(newDiscution.Handle, true);
               // FlashWindow.Start(newDiscution);
                /*FLASHWINFO fw = new FLASHWINFO();
                fw.cbSize = Convert.ToUInt32(Marshal.SizeOf(typeof(FLASHWINFO)));
                fw.hwnd = newDiscution.Handle;
                fw.dwFlags = 4;
                fw.uCount = UInt32.MaxValue;
                FlashWindowEx(ref fw);*/
            }
            
        }

      

        

       
    }
}
